#include <Tabuleiro.h>

  Tabuleiro::Tabuleiro()
  {
	  int i,j;

	  for(i=0; i < TAM; i++)
		  for(j=0; j < TAM; j++)
			  tab[i][j] = 0;
  }
  
  Tabuleiro::Tabuleiro(const Jogador& jog1, const Jogador& jog2)
  {
    int i, j;
    
    for(i=0; i < TAM; i++)
    {
        for(j = 0; j < TAM ;j++)
        {
            tab[i][j] = 0;
        }
    }
 	
  	j1 = jog1;
  	j2 = jog2;
  }
 
  Tabuleiro::~Tabuleiro()
  {
	  
  }

  Tabuleiro& Tabuleiro::operator=(const Tabuleiro& t)
  {
  	
	int i,j;
	
	for(i=0; i <TAM; i++)
		for(j=0;j<TAM;j++)
			tab[i][j] = t.getPos(i,j);
  	j1 = t.getJogador1();
  	j2 = t.getJogador2();
  	
  	return *this;  	
  }  

void Tabuleiro::setPos(const int i, const int j, const int val)
{
	tab[i][j] = val;
}
int Tabuleiro::getPos(const int i, const int j)const
{
	return tab[i][j];
}
  

  void Tabuleiro::setJogador1 ( const Jogador& new_var )   {
      j1 = new_var;
  }

  Jogador Tabuleiro::getJogador1 ( ) const
  {
    return j1;
  }

  void Tabuleiro::setJogador2 ( const Jogador& new_var )   {
      j2 = new_var;
  }

  Jogador Tabuleiro::getJogador2 ( ) const
  {
    return j2;
  }
  
  set<Coordenada> Tabuleiro::jogadasPossiveis(const Jogador& jog)const
  {
   	set<Coordenada> s;
  	Coordenada c;
  	int i,j,k;
  	
  	for(i=0;i<TAM;i++)
  	{
  		for(j=0; j<TAM; j++)
  		{
  			if(tab[i][j] == 0)
  			{
  				// para cima
  				for(k=1; i-k>=0 && tab[i-k][j] != 0 && jog != tab[i-k][j]; k++) ;
  				if(k != 1 && i-k>=0 && (jog == tab[i-k][j]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  				
  				// para baixo
  				for(k=1; i+k<TAM && tab[i+k][j] != 0 && jog != tab[i+k][j]; k++) ;
  				if(k != 1 && i+k<TAM && (jog == tab[i+k][j]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  				
  				// para direita
  				for(k=1; j+k<TAM && tab[i][j+k] != 0 && jog != tab[i][j+k]; k++) ;
  				if(k != 1 && j+k<TAM && (jog == tab[i][j+k]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  				
  				// para esquerda
  				for(k=1; j-k>=0 && tab[i][j-k] != 0 && jog != tab[i][j-k]; k++) ;
  				if(k != 1 && j-k>=0 && (jog == tab[i][j-k]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  				
  				// para esquerda e cima
  				for(k=1; i-k>=0 && j-k >=0 && tab[i-k][j-k] != 0 && jog != tab[i-k][j-k]; k++) ;
  				if(k != 1 && i-k>=0 && j-k>=0 && (jog == tab[i-k][j-k]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  				
  				// para direita e baixo
  				for(k=1; i+k<TAM && j+k<TAM && tab[i+k][j+k] != 0 && jog != tab[i+k][j+k]; k++) ;
  				if(k != 1 && i+k<TAM && j+k<TAM && (jog == tab[i+k][j+k]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  				
  				// para direita e cima
  				for(k=1; i-k>=0 && j+k <TAM && tab[i-k][j+k] != 0 && jog != tab[i-k][j+k]; k++) ;
  				if(k != 1 && i-k>=0 && j+k<TAM && (jog == tab[i-k][j+k]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  				
  				// para esquerda e baixo  				
  				for(k=1; i+k<TAM && j-k>=0 && tab[i+k][j-k] != 0 && jog != tab[i+k][j-k]; k++) ;
  				if(k != 1 && i+k<TAM && j-k>=0 && (jog == tab[i+k][j-k]))
  				{
  					c = make_pair(i,j);
  					s.insert(c);
					continue;
  				}
  								
  			}
  		}
  	}
  	  	
  	return s;
  }
  
  void Tabuleiro::joga(const Coordenada& coord, const Jogador& jog)
  {
  	int k;
  	int i,j;
		int aux;
  	
  	i = coord.getX();
  	j = coord.getY();
  	
    	
  	/* para cima */
  	for(k=1; (i-k >= 0) && ((tab[i-k][j] != 0) && (jog != tab[i-k][j])); k++) ;
  	
  	if((i-k >= 0) && (k > 1) && (jog == tab[i-k][j]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i-k][j] = jog.getId();
  	}
  		
  	
  	/* para baixo */
  	for(k=1; (i+k < TAM) && ((tab[i+k][j] != 0) && (jog != tab[i+k][j])); k++) ;
  	
  	if((i+k < TAM) && (k > 1) && (jog == tab[i+k][j]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i+k][j] = jog.getId();
  	}  	
  	
  	
  	/* para direita */
  	for(k=1; (j+k < TAM) && ((tab[i][j+k] != 0) && (jog != tab[i][j+k])); k++) ;
  	
  	if((j+k < TAM) && (k > 1) && (jog == tab[i][j+k]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i][j+k] = jog.getId();
  	}

  	
  	/* para esquerda */
  	for(k=1; (j-k >= 0) && ((tab[i][j-k] != 0) && (jog != tab[i][j-k])); k++) ;
  	
  	if((j-k >= 0) && (k > 1) && (jog == tab[i][j-k]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i][j-k] = jog.getId();
  	}
  	
  	
  	/* para esquerda e cima */
  	for(k=1; ((j-k >= 0) && (i-k >= 0)) && ((tab[i-k][j-k] != 0) && (jog != tab[i-k][j-k])); k++) ;
  	
  	if(((j-k >= 0) && (i-k >= 0)) && (k > 1) && (jog == tab[i-k][j-k]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i-k][j-k] = jog.getId();
  	}

  	
  	/* para direita e baixo */
  	for(k=1; ((j+k < TAM) && (i+k < TAM)) && ((tab[i+k][j+k] != 0) && (jog != tab[i+k][j+k])); k++) ;
  	
  	if(((j+k < TAM) && (i+k < TAM)) && (k > 1) && (jog == tab[i+k][j+k]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i+k][j+k] = jog.getId();
  	}


  	/* para direita e cima */
  	for(k=1; ((j+k < TAM) && (i-k >= 0)) && ((tab[i-k][j+k] != 0) && (jog != tab[i-k][j+k])); k++) ;
  	
  	if(((j+k < TAM) && (i-k >= 0)) && (k > 1) && (jog == tab[i-k][j+k]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i-k][j+k] = jog.getId();
  	}

  	/* para esquerda e baixo */
  	for(k=1; ((j-k >= 0) && (i+k < TAM)) && ((tab[i+k][j-k] != 0) && (jog != tab[i+k][j-k])); k++) ;
  	
  	if(((j-k >= 0) && (i+k < TAM)) && (k > 1) && (jog == tab[i+k][j-k]))
  	{
  		aux = k;
  		for(k=1; k < aux; k++)
  			tab[i+k][j-k] = jog.getId();
  	}
  	
	tab[i][j] = jog.getId();
  }
